<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
</body>
<script>
    /**1.检测插件
     * 检测浏览器是否安装了某个插件是开发中常见的需求。除 IE10 及更低版本外的浏览器，都可以通过
     * plugins 数组来确定。这个数组中的每一项都包含如下属性(name：插件名称,description：插件介绍。
     * filename：插件的文件名。length：由当前插件处理的MIME 类型数量。)
     */
        //通常，name 属性包含识别插件所需的必要信息，尽管不是特别准确。检测插件就是遍历浏览器中可用的插件，并逐个比较插件的名称
        //插件检测，IE10 及更低版本无效。
        let hasPlugin = function(name){
            //1.将输入的插件名称转换成小写，便于比较
            name = name.toLowerCase();
            //2.获取浏览器所有已经安装了的插件对象的伪数组,并做非空处理
            let plugins = window.navigator.plugins || [];
            //3.将数组统一进行处理
            let plugins_array = Array.from(plugins);
            console.log(plugins_array)
            //4.返回查询的结果
            return plugins_array.some(item => item.name && item.name.toLowerCase().indexOf(name) > -1);
        }
        console.log(hasPlugin('TEST!'));//false
        console.log(hasPlugin('Vue'));//false
    /**2.旧版本 IE 中的插件检测。
     * 1.IE11 的 window.navigator 对象开始支持 plugins 和 mimeTypes 属性。这意味着前面定义的函数可以适用于所有较新版本
     *   的浏览器。而且，IE11 中的 ActiveXObject 也从 DOM 中隐身了，意味着不能再用它来作为检测特性的手段。
     * 2.IE10 及更低版本中检测插件的问题比较多，因为这些浏览器不支持 Netscape 式的插件。在这些 IE中检测插件要使用专有的
     *   ActiveXObject，并尝试实例化特定的插件。IE 中的插件是实现为 COM 对象的，由唯一的字符串标识。因此，要检测某个插
     *   件就必须知道其 COM 标识符。例如，Flash 的标识符是"ShockwaveFlash.ShockwaveFlash"。知道了这个信息后，就可
     *   以像这样检测 IE中是否安装了 Flash：
     */
        let hasIEPlugin = function(pluginName){
            try {
                //1.尝试采用ActiveXObject实例化特定插件
                new ActiveXObject(pluginName);
                //2.如果成功，则返回true
                return true;
            }catch (err){
                //3.如果失败则进入catch,并返回false
                return false;
            }
       }
       //hasIEPlugin()函数接收一个 DOM 标识符参数。为检测插件，这个函数会使用传入的标识符创建一个新 ActiveXObject 实例。
       //相应代码封装在一个 try/catch 语句中，因此如果创建的插件不存在则会抛出错误。如果创建成功则返回 true，如果失败则在
       // catch 块中返回 false。
       console.log(hasIEPlugin('ShockwaveFlash.ShockwaveFlash'));//false
       console.log(hasIEPlugin('QuickTime.QuickTime'));//false
    /**3.在所有浏览器中检测
     * 因为检测插件涉及两种方式，所以一般要针对特定插件写一个函数，而不是使用通常的检测函数。
     */
    // 在所有浏览器中检测 Flash
    function hasFlash() {
        //1.IE10以上所有浏览器检测
        let result = hasPlugin("Flash");
        if (!result){
            //2.IE10以下浏览器检测
            result = hasIEPlugin("ShockwaveFlash.ShockwaveFlash");
        }
        //返回检测结果
        return result;
    }
    //每个函数都先尝试使用非 IE 插件检测方式，如果返回 false（对 IE可能会），则再使用 IE插件检测方式。
    //如果 IE插件检测方式再返回 false，整个检测方法也返回 false。只要有一种方式返回 true，检测方法就会返回 true。
</script>
</html>